package com.forum.message.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis 配置类
 */
@Slf4j
@Configuration
public class RedisConfig {

    /**
     * 配置 RedisTemplate
     * 
     * 使用 @ConditionalOnMissingBean 确保在连接工厂不可用时不会尝试创建
     *
     * @param connectionFactory Redis 连接工厂
     * @return RedisTemplate 实例
     */
    @Bean
    @Primary
    @Autowired(required = false)
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        if (connectionFactory == null) {
            log.warn("Redis连接工厂不可用，将使用降级处理");
            return null;
        }
        
        try {
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(connectionFactory);
            
            // 使用 StringRedisSerializer 来序列化和反序列化 redis 的 key
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            // 使用 GenericJackson2JsonRedisSerializer 来序列化和反序列化 redis 的 value
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            
            // Hash 的 key 也采用 StringRedisSerializer 的序列化方式
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            // Hash 的 value 也采用 GenericJackson2JsonRedisSerializer 的序列化方式
            redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
            
            redisTemplate.afterPropertiesSet();
            log.info("Redis连接成功初始化");
            return redisTemplate;
        } catch (Exception e) {
            log.error("初始化Redis连接失败: {}", e.getMessage(), e);
            return null;
        }
    }
} 